﻿using System;
using System.Collections.Generic;
using System.Text;
using Galaxy.ModuleInterface.Messages.Source;
using Galaxy.ModuleInterface.Messages.Destination;
using System.Runtime.Serialization;

namespace Galaxy.ModuleInterface.Messages
{
    /* ---------------------------------------------------------------------- */

    /// <summary>Типизированное сообщение</summary>
    /// <typeparam name="T">Тип данных сообщения</typeparam>
    [Serializable]
    public class CTypedMessage<TData> : CGalaxyModuleMessage,
        ITypedMesage<TData>, IGalaxyModuleMessage
    {
        /// <summary>Данные сообщения</summary>
        private TData fData;

        /// <summary>Данные сообщения</summary>
        public virtual TData Data { get { return fData; } set { fData = value; } }

        /* ---------------------------------------------------------------------- */

        /// <summary>Типизированное сообщение</summary>
        /// <param name="Data">Данные</param>
        /// <param name="Source">Источник сообщения</param>
        public CTypedMessage(TData Data, IGalaxyModule Source)
            : base(Source) { fData = Data; }

        /// <summary>Типизированное сообщение</summary>
        /// <param name="Data">Данные</param>
        /// <param name="Source">Источник сообщения</param>
        public CTypedMessage(TData Data, string Source)
            : base(Source) { fData = Data; }

        /// <summary>Типизированное сообщение</summary>
        /// <param name="Data">Данные</param>
        /// <param name="Source">Источник сообщения</param>
        /// <param name="Distination">Место назначения сообщения</param>
        public CTypedMessage(TData Data, IGalaxyModule Source, params IGalaxyModule[] Distination)
            : base(Source, Distination) { fData = Data; }

        /// <summary>Типизированное сообщение</summary>
        /// <param name="Data">Данные</param>
        /// <param name="Source">Источник сообщения</param>
        /// <param name="Distination">Место назначения сообщения</param>
        public CTypedMessage(TData Data, string Source, params IGalaxyModule[] Distination)
            : base(Source, Distination) { fData = Data; }

        /// <summary>Типизированное сообщение</summary>
        /// <param name="Data">Данные</param>
        /// <param name="Source">Источник сообщения</param>
        /// <param name="Distination">Место назначения сообщения</param>
        public CTypedMessage(TData Data, IGalaxyModule Source, params string[] Distination)
            : base(Source, Distination) { fData = Data; }

        /// <summary>Типизированное сообщение</summary>
        /// <param name="Data">Данные</param>
        /// <param name="Source">Источник сообщения</param>
        /// <param name="Distination">Место назначения сообщения</param>
        public CTypedMessage(TData Data, string Source, params string[] Distination)
            : base(Source, Distination) { fData = Data; }

        /// <summary>Типизированное сообщение</summary>
        /// <param name="Data">Данные</param>
        /// <param name="Source">Источник сообщения</param>
        /// <param name="Distination">Место назначения сообщения</param>
        public CTypedMessage(TData Data, ISource Source, IDestination Distination)
            : base(Source, Distination) { fData = Data; }

        protected CTypedMessage(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            Data = (TData)info.GetValue("Data:" + typeof(TData).ToString(), typeof(TData));
        }

        /* ---------------------------------------------------------------------- */

        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {               
            base.GetObjectData(info, context);
            info.AddValue("Data:" + typeof(TData).ToString(), Data);
        }

        public override string ToString()
        {
            return base.ToString() + " : " + Data;
        }

        /* ---------------------------------------------------------------------- */
    }
}
